#pragma once
#include<iostream>
#include<string>
using namespace std;

   
	//1、函数对象在使用时，可以像普通函数那样调用，可以有参数，可以有返回值
	class MyAdd
	{
	public:
		int operator()(int v1, int v2)
		{
			return v1 + v2;
		}

	};

	void test01()
	{
		MyAdd myadd;
		cout << myadd(10, 10) << endl;
	}

	//2、函数对象可以有自己的状态
	class myPrint
	{
	public:
		myPrint()
		{
			count = 0;
		}
		void operator()(string test)
		{
			cout << test << endl;
			count++;
		}
		int count;   //内部自己的状态
	};
	void test02()
	{
		myPrint myprint;
		myprint("hello world");
		myprint("hello world");
		myprint("hello world");
		myprint("hello world");
		cout << "myprint调用次数为" << myprint.count << endl;
	}

	//3、函数对象可以作为参数传递
	void doprint(myPrint& mp, string test)
	{
		mp(test);
	}

	void test03()
	{
		myPrint myPrint;
		doprint(myPrint, "Hello C++");
	}


int main()
{
	test01();
	test02();
	test03();
	system("pause");
	return 0;
}
